# 描述
# 输入一个表达式（用字符串表示），求这个表达式的值。
# 保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’， ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
#
# 数据范围：表达式计算结果和过程中满足  ，字符串长度满足
#
# 输入描述：
# 输入一个算术表达式
#
# 输出描述：
# 得到计算结果




# 转为后缀表达式,运算表达式元素之间用空格隔开:
def change_opt(opt):
    result = []  # 结果列表
    stack = []  # 栈
    item_lists = opt.split(' ')
    for item in item_lists:
        # 如果当前字符为整数或者小数那么直接放入结果列表
        if item.isdigit() or '.' in item:
            result.append(item)
        else:
            if len(stack) == 0:  # 如果栈空，直接入栈
                stack.append(item)
            elif item in '*/(':  # 如果当前字符为*/（，直接入栈
                stack.append(item)
            elif item == ')':
                t = stack.pop()
                while t != '(':
                    result.append(t)
                    t = stack.pop()
            elif item in '+-' and stack[-1] in '*/':
                if stack.count('(') == 0:
                    while stack:
                        result.append(stack.pop())
                else:  # 如果有左括号，输出到左括号为止
                    t = stack.pop()
                    while t != '(':
                        result.append(t)
                        t = stack.pop()
                    stack.append('(')
                stack.append(item)
            else:
                stack.append(item)
    # 把栈中数据弹出
    while stack:
        result.append(stack.pop())
    return result


# 后缀表达式计算
def get_value(follow):
    num = []
    base_opt = ['+', '-', '*', '/']
    # print(follow)
    for j in follow:
        if j.isdigit() or '.' in j:
            num.append(float(j))
        if j in base_opt:
            num2 = num.pop()
            num1 = num.pop()
            res = method(num1, num2, j)
            num.append(res)
    return num[0]


def method(num1, num2, j):
    if j == "+":
        res = num1 + num2
    elif j == "-":
        res = num1 - num2
    elif j == "*":
        res = num1 * num2
    else:
        res = num1 / num2
    return res


if __name__ == '__main__':
    # 空格隔开,括号注意中英文不要乱
    opt = "9 + ( 3 - 1 ) * 3 + 10 / 2"
    result = change_opt(opt)
    print(get_value(result))
